/*
 * @Author: lll 1280388921@qq.com
 * @Date: 2025-04-23 15:31:39
 * @LastEditors: lll 1280388921@qq.com
 * @LastEditTime: 2025-04-23 17:03:08
 * @FilePath: /lesson33/mysignal.cc
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#include <iostream>
#include <unistd.h>
#include <cstdlib>
#include <sys/wait.h>
#include <signal.h>

using namespace std;

void printPending(sigset_t &pending)
{
    for (int i = 31; i >= 1; i--)
    {
        if (sigismember(&pending, i) == 1)
        {
            cout << "1";
        }
        else
        {
            cout << "0";
        }
    }
    cout << endl
         << endl;
}

void handler(int signo)
{
    cout << "cat a signo: " << signo << endl;
}

int main()
{
    // 将所有信号进行屏蔽
    sigset_t bset, oset;
    sigemptyset(&bset);
    sigemptyset(&oset);
    for (int i = 1; i <= 31; i++)
    {
        sigaddset(&bset, i);
    }
    sigprocmask(SIG_SETMASK, &bset, &oset);
    sigset_t pending;
    while (1)
    {
        // 获取
        int n = sigpending(&pending);
        if (n < 0)
        {
            continue;
        }
        // 打印
        printPending(pending);
        sleep(2);
    }
    return 0;
}

// int main()
// {
//     signal(2,handler);
//     //1.先对2号信号进行屏蔽
//     sigset_t bset,oset;
//     //在用户栈开辟空间
//     sigemptyset(&bset);
//     sigemptyset(&oset);
//     sigaddset(&bset,2);
//     //在这里还没把2号信号屏蔽
//     //因为还没设置进进程的PCB中

//     //调用系统调用
//     sigprocmask(SIG_SETMASK,&bset,&oset);
//     //屏蔽了2号信号，但是没有收到2号信号

//     //2.重复打印当前进程的pending信号集
//     sigset_t pending;
//     int cnt=0;
//     while(1)
//     {
//         //获取
//         int n=sigpending(&pending);
//         if(n<0)
//         {
//             continue;
//         }
//         //打印
//         printPending(pending);
//         sleep(1);
//         cnt++;

//         //解除屏蔽
//         if(cnt==20)
//         {
//             cout<<"unblock 2 sihno"<<endl;
//             sigprocmask(SIG_SETMASK,&oset,nullptr);
//         }
//     }

//     //3.发送2号信号

//     return 0;
// }

// int main()
// {
//     signal(2,SIG_IGN);
//     while(1)
//     {
//         cout<<"I am a process"<<endl;
//         sleep(1);
//     }
//     return 0;
// }